Apex Triggers হলো Apex কোডের এমন একটি ফিচার যা Salesforce ডেটাবেজে নির্দিষ্ট ইভেন্ট ঘটলে স্বয়ংক্রিয়ভাবে কার্যকর হয়। Apex Triggers মূলত Salesforce ডেটাবেজের উপর ভিত্তি করে কাস্টম লজিক তৈরি করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, নতুন রেকর্ড তৈরি হওয়া, আপডেট হওয়া বা ডিলিট করা হলে নির্দিষ্ট কার্যক্রম স্বয়ংক্রিয়ভাবে সম্পন্ন করতে Triggers ব্যবহার করা হয়।
Apex Trigger সাধারণত দুটি টাইমিংয়ে কাজ করে:
Trigger ইভেন্টগুলো হলো:
একটি Trigger লেখার জন্য ডাটাবেজ অবজেক্ট এবং ইভেন্ট উল্লেখ করতে হয়। Trigger লেখার সাধারণ Syntax:
trigger TriggerName on ObjectName (events) {
// Trigger logic
}
উদাহরণ:
trigger AccountTrigger on Account (before insert, after insert) {
if (Trigger.isBefore) {
if (Trigger.isInsert) {
// Insert-এর আগে কার্যক্রম
System.debug('Before Insert Trigger Executed');
}
}
if (Trigger.isAfter) {
if (Trigger.isInsert) {
// Insert-এর পরে কার্যক্রম
System.debug('After Insert Trigger Executed');
}
}
}
এখানে AccountTrigger
নামে একটি Trigger তৈরি করা হয়েছে যা Account
অবজেক্টের উপর before insert
এবং after insert
ইভেন্টে কাজ করবে।
Trigger চালানোর সময় কিছু Trigger Context Variables পাওয়া যায় যা Trigger-এর কার্যক্রম বুঝতে সহায়ক। Context Variables ট্রিগারের সময় নির্দিষ্ট ডেটা এবং তথ্য প্রদান করে।
true
রিটার্ন করে।true
রিটার্ন করে।true
রিটার্ন করে।true
রিটার্ন করে।true
রিটার্ন করে।ধরুন, আমরা একটি Trigger তৈরি করতে চাই, যা নতুন Account
রেকর্ড তৈরি হওয়ার পর একটি স্বাগতম বার্তা প্রদর্শন করবে।
trigger AccountWelcomeMessage on Account (after insert) {
for (Account acc : Trigger.new) {
System.debug('Welcome, ' + acc.Name + ' to our platform!');
}
}
এখানে AccountWelcomeMessage
Trigger নতুন Account
রেকর্ড Insert হওয়ার পর after insert
ইভেন্টে কাজ করবে এবং প্রতিটি নতুন রেকর্ডের জন্য স্বাগতম বার্তা প্রদর্শন করবে।
ধরুন, আমরা একটি Trigger তৈরি করতে চাই, যা Account
রেকর্ড আপডেট হওয়ার আগে Industry
ফিল্ড চেক করবে এবং সেটি খালি থাকলে একটি ডিফল্ট মান সেট করবে।
trigger SetDefaultIndustry on Account (before update) {
for (Account acc : Trigger.new) {
if (acc.Industry == null) {
acc.Industry = 'Technology';
}
}
}
এখানে SetDefaultIndustry
Trigger before update
ইভেন্টে কাজ করবে এবং Industry
ফিল্ড খালি থাকলে সেটি Technology
মান দিয়ে পূরণ করবে।
Apex Trigger ব্যবহার করে Salesforce প্ল্যাটফর্মে কাস্টম লজিক ও অটোমেশনের মাধ্যমে ব্যবসায়িক প্রক্রিয়া সহজ ও কার্যকরী করা সম্ভব।
Apex Trigger হলো Apex প্রোগ্রামিং ভাষায় লেখা একটি বিশেষ কোড ব্লক যা Salesforce ডেটাবেজ ইভেন্টের উপর ভিত্তি করে নির্দিষ্ট কার্যক্রম স্বয়ংক্রিয়ভাবে চালায়। যখন একটি নির্দিষ্ট ডেটাবেজ ইভেন্ট যেমন, insert, update, delete অথবা undelete সংঘটিত হয়, তখন Trigger স্বয়ংক্রিয়ভাবে কার্যকর হয় এবং নির্দিষ্ট লজিক বা কোড চালাতে পারে।
Trigger-এর মাধ্যমে Salesforce প্ল্যাটফর্মে ডেটা প্রক্রিয়াকরণ আরও সহজ হয়। উদাহরণস্বরূপ, যখন একটি নতুন রেকর্ড তৈরি হয় তখন কিছু ডেটা স্বয়ংক্রিয়ভাবে সেট করতে বা যখন একটি রেকর্ড ডিলিট করা হয় তখন সম্পর্কিত অন্য রেকর্ডও মুছে ফেলতে Trigger ব্যবহৃত হয়। এটি বিশেষভাবে ডেটা ভ্যালিডেশন, ডেটা আপডেট, এবং রেকর্ড কাস্টমাইজেশনে সহায়ক।
Apex Trigger মূলত দুই ধরনের হতে পারে:
Before Trigger:
After Trigger:
Apex Trigger ডিক্লেয়ার করার জন্য trigger
কিওয়ার্ড ব্যবহার করা হয় এবং নির্দিষ্ট অবজেক্টের সাথে ট্রিগারটি সংযুক্ত থাকে।
trigger TriggerName on ObjectName (trigger_events) {
// Trigger logic goes here
}
নিচে একটি Before Insert Trigger উদাহরণ দেয়া হলো, যেখানে Account
অবজেক্টের নতুন রেকর্ডে কিছু ডিফল্ট মান সেট করা হয়েছে।
trigger AccountBeforeInsert on Account (before insert) {
for (Account acc : Trigger.new) {
if (acc.Industry == null) {
acc.Industry = 'Technology'; // ডিফল্ট মান সেট করা হচ্ছে
}
}
}
Account
রেকর্ড তৈরি হলে, যদি Industry
ফিল্ড ফাঁকা থাকে, তাহলে এতে Technology
ডিফল্ট মান সেট করা হবে।নিচে একটি After Update Trigger উদাহরণ দেয়া হলো, যেখানে Contact
অবজেক্টের রেকর্ড আপডেট হওয়ার পরে Account
অবজেক্টে কিছু পরিবর্তন আনা হয়েছে।
trigger ContactAfterUpdate on Contact (after update) {
Map<Id, Account> accountMap = new Map<Id, Account>();
for (Contact con : Trigger.new) {
if (con.AccountId != null) {
Account acc = new Account(Id = con.AccountId);
acc.Last_Contacted__c = Date.today();
accountMap.put(acc.Id, acc);
}
}
update accountMap.values();
}
Contact
অবজেক্টের একটি রেকর্ড আপডেট করা হয়, তখন সংশ্লিষ্ট Account
রেকর্ডের Last_Contacted__c
ফিল্ডে বর্তমান তারিখ যোগ করা হয়।Apex Trigger-এ কিছু বিশেষ ভেরিয়েবল রয়েছে, যেগুলো Trigger চলার সময় প্রয়োজনীয় ডেটা এবং প্রসঙ্গ প্রদান করে। কিছু গুরুত্বপূর্ণ Context Variables:
true
রিটার্ন করে।true
রিটার্ন করে।true
রিটার্ন করে।এইভাবে Apex Trigger ব্যবহার করে Salesforce প্ল্যাটফর্মে বিভিন্ন ডেটা প্রসেসিং এবং ব্যবসায়িক কার্যক্রমকে সহজ ও স্বয়ংক্রিয় করা যায়।
Before Trigger এবং After Trigger হলো Apex Trigger-এর দুটি প্রধান টাইমিং, যা Salesforce ডেটাবেজে ইভেন্টের উপর নির্ভর করে বিভিন্ন কাজ সম্পন্ন করতে ব্যবহৃত হয়। Before Trigger
ডেটা সেভ হওয়ার আগে কার্যকর হয়, এবং After Trigger
ডেটা সেভ হওয়ার পর কার্যকর হয়। এই দুটি টাইমিং বিভিন্ন প্রয়োজন অনুযায়ী ব্যবহার করা হয়।
Before Trigger সাধারণত ডেটা সেভ হওয়ার আগে ডেটা ভ্যালিডেশন বা ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এই Trigger-এ ডেটা সরাসরি পরিবর্তন বা মডিফাই করা যায়, কারণ ডেটা এখনও ডেটাবেজে সেভ হয়নি। Before Trigger-এ ডেটার মান পরিবর্তন করা হলে সেই পরিবর্তিত মান ডেটাবেজে সেভ হবে।
ধরুন, আমরা একটি Trigger তৈরি করতে চাই, যা নতুন Account
রেকর্ড ইনসার্ট করার আগে Industry
ফিল্ড চেক করবে এবং সেটি খালি থাকলে Technology
মান দিয়ে পূরণ করবে।
trigger SetDefaultIndustry on Account (before insert) {
for (Account acc : Trigger.new) {
if (acc.Industry == null) {
acc.Industry = 'Technology';
}
}
}
এখানে SetDefaultIndustry
Trigger before insert
ইভেন্টে কাজ করবে। যদি Industry
ফিল্ড খালি থাকে, তাহলে এটি Technology
মান সেট করবে এবং তারপর রেকর্ডটি ডেটাবেজে সেভ হবে।
ধরুন, আমরা একটি Trigger তৈরি করতে চাই, যা Account
রেকর্ড আপডেট করার আগে AnnualRevenue
ফিল্ড চেক করবে এবং সেটি যদি 0
হয়, তাহলে একটি নির্দিষ্ট মান দিয়ে সেট করবে।
trigger CheckAnnualRevenue on Account (before update) {
for (Account acc : Trigger.new) {
if (acc.AnnualRevenue == 0) {
acc.AnnualRevenue = 50000; // Default value
}
}
}
এখানে CheckAnnualRevenue
Trigger before update
ইভেন্টে কাজ করবে এবং AnnualRevenue
ফিল্ড যদি শূন্য থাকে, তাহলে এটি ডিফল্ট মান 50000
দিয়ে পূরণ করবে।
After Trigger সাধারণত ডেটা সেভ হওয়ার পর কার্যকর হয় এবং এটি অন্য অবজেক্টের উপর নির্ভরশীল কার্যক্রম সম্পন্ন করতে ব্যবহৃত হয়। After Trigger-এ মূল ডেটা পরিবর্তন করা সম্ভব নয়, কারণ ডেটা ইতিমধ্যে ডেটাবেজে সেভ হয়ে গেছে। After Trigger-এ সাধারণত লজিকাল কাজ, যেমন- সম্পর্কিত রেকর্ড তৈরি, ইমেইল পাঠানো, বা লজ ব্যবহার করা হয়।
ধরুন, আমরা একটি Trigger তৈরি করতে চাই, যা নতুন Account
রেকর্ড তৈরি হওয়ার পর স্বয়ংক্রিয়ভাবে একটি Contact
রেকর্ড তৈরি করবে, যেখানে Account
এর নাম সেট করা থাকবে।
trigger CreateContactAfterAccount on Account (after insert) {
List<Contact> contacts = new List<Contact>();
for (Account acc : Trigger.new) {
Contact con = new Contact(
LastName = acc.Name,
AccountId = acc.Id
);
contacts.add(con);
}
insert contacts;
}
এখানে CreateContactAfterAccount
Trigger after insert
ইভেন্টে কাজ করবে এবং প্রতিটি নতুন Account
রেকর্ড তৈরি হওয়ার পর স্বয়ংক্রিয়ভাবে একটি Contact
রেকর্ড তৈরি করবে।
ধরুন, আমরা একটি Trigger তৈরি করতে চাই, যা Opportunity
রেকর্ড আপডেট হওয়ার পর Account
রেকর্ডের Last Activity Date
ফিল্ড আপডেট করবে।
trigger UpdateAccountActivity on Opportunity (after update) {
List<Account> accounts = new List<Account>();
for (Opportunity opp : Trigger.new) {
Account acc = new Account(
Id = opp.AccountId,
LastActivityDate = Date.today()
);
accounts.add(acc);
}
update accounts;
}
এখানে UpdateAccountActivity
Trigger after update
ইভেন্টে কাজ করবে এবং Opportunity
আপডেট হওয়ার পর সম্পর্কিত Account
রেকর্ডের Last Activity Date
আপডেট করবে।
বৈশিষ্ট্য | Before Trigger | After Trigger |
---|---|---|
কার্যক্রমের সময় | ডেটা সেভ হওয়ার আগে কার্যকর হয় | ডেটা সেভ হওয়ার পর কার্যকর হয় |
প্রক্রিয়া | ডেটা পরিবর্তন বা ভ্যালিডেশন করতে ব্যবহৃত হয় | অন্যান্য অবজেক্টের উপর নির্ভরশীল কাজ, যেমন সম্পর্কিত রেকর্ড তৈরি, ইমেইল পাঠানো |
মূল ডেটা পরিবর্তন | হ্যাঁ, মূল ডেটা পরিবর্তন করা যায় | না, মূল ডেটা পরিবর্তন করা যায় না |
ব্যবহার | ডেটা ভ্যালিডেশন, ডিফল্ট মান সেট, ইত্যাদি | সম্পর্কিত রেকর্ড তৈরি, ইমেইল পাঠানো, অডিটিং ইত্যাদি |
Before এবং After Trigger ব্যবহার করে Salesforce ডেটাবেজের ইভেন্ট-চালিত কার্যক্রম সহজ এবং স্বয়ংক্রিয় করা যায়, যা বিভিন্ন ব্যবসায়িক নিয়ম এবং প্রক্রিয়াকে কার্যকর করে।
Insert, Update, Delete Trigger Events Apex Trigger-এর প্রধান ইভেন্ট, যা Salesforce ডেটাবেজে রেকর্ড সেভ বা পরিবর্তন করার সময় নির্দিষ্ট কার্যক্রম সম্পাদন করতে সহায়ক। প্রতিটি ইভেন্টে Before এবং After Trigger ব্যবহার করা যায়, যা ইভেন্টের সময় অনুযায়ী আলাদা কার্যক্রম সম্পন্ন করে।
Insert Trigger তখন কার্যকর হয়, যখন নতুন কোনো রেকর্ড Salesforce ডেটাবেজে তৈরি হয়। Insert Trigger-এর মাধ্যমে রেকর্ডে নতুন ডেটা সেট করা যায় এবং ডেটা যাচাই করা যায়।
trigger AccountBeforeInsert on Account (before insert) {
for (Account acc : Trigger.new) {
if (acc.Industry == null) {
acc.Industry = 'Technology'; // ডিফল্ট মান সেট করা হচ্ছে
}
}
}
Account
রেকর্ডের Industry
ফিল্ডে ডিফল্ট মান Technology
সেট করা হয়েছে, যদি Industry
ফিল্ড ফাঁকা থাকে।Update Trigger তখন কার্যকর হয়, যখন একটি বিদ্যমান রেকর্ডে কিছু পরিবর্তন বা আপডেট করা হয়। Update Trigger-এর মাধ্যমে ডেটা যাচাই করা এবং সম্পর্কিত অন্যান্য রেকর্ড আপডেট করা যায়।
trigger ContactAfterUpdate on Contact (after update) {
Map<Id, Account> accountMap = new Map<Id, Account>();
for (Contact con : Trigger.new) {
if (con.AccountId != null) {
Account acc = new Account(Id = con.AccountId);
acc.Last_Contacted__c = Date.today();
accountMap.put(acc.Id, acc);
}
}
update accountMap.values();
}
Contact
অবজেক্টের রেকর্ড আপডেট করার পরে সংশ্লিষ্ট Account
রেকর্ডের Last_Contacted__c
ফিল্ডে বর্তমান তারিখ সেট করা হচ্ছে।Delete Trigger তখন কার্যকর হয়, যখন একটি রেকর্ড Salesforce ডেটাবেজ থেকে মুছে ফেলা হয়। Delete Trigger-এর মাধ্যমে রেকর্ড ডিলিট করার আগে বা পরে নির্দিষ্ট কার্যক্রম সম্পন্ন করা যায়।
trigger AccountBeforeDelete on Account (before delete) {
for (Account acc : Trigger.old) {
System.debug('Deleting Account: ' + acc.Name);
}
}
Account
রেকর্ড ডিলিট করার আগে Account
এর নাম প্রিন্ট করে।Trigger Context Variables Trigger-এর বিভিন্ন ইভেন্টের সময় প্রয়োজনীয় ডেটা এবং প্রসঙ্গ প্রদান করে। কিছু গুরুত্বপূর্ণ Context Variables:
true
রিটার্ন করে।true
রিটার্ন করে।true
রিটার্ন করে।Trigger Events Salesforce প্ল্যাটফর্মে ডেটা প্রসেসিং এবং অটোমেশন সহজ করে এবং ডেটাবেজ ইভেন্টের উপর ভিত্তি করে বিভিন্ন লজিক প্রয়োগ করতে সহায়ক।
Recursive Trigger হলো এমন Trigger যা নিজেই পুনরায় কল হতে পারে, অর্থাৎ এক Trigger অন্য Trigger কে চালু করে এবং এর ফলে একটি লুপ বা পুনরাবৃত্তি তৈরি হয়। Recursive Trigger সাধারণত ডেটাবেজের ওপর অতিরিক্ত লোড তৈরি করে এবং গভর্নর লিমিট অতিক্রম করতে পারে, ফলে এটি Salesforce সিস্টেমে সমস্যা সৃষ্টি করতে পারে। তাই Recursive Trigger এড়ানো এবং ভালো কোডিং প্র্যাকটিস অনুসরণ করা জরুরি।
Recursive Trigger এড়ানোর জন্য কিছু সাধারণ পদ্ধতি অনুসরণ করা যেতে পারে:
Static Boolean Flag ব্যবহার: Static Boolean ফ্ল্যাগ ব্যবহার করে Recursive Trigger এড়ানো যায়। একটি স্ট্যাটিক ভ্যারিয়েবল তৈরি করে প্রথমবার Trigger কল হওয়ার সময় সেটিকে true
সেট করা হয় এবং পরবর্তীতে Trigger চালু হলে সেটি false
চেক করা হয়।
উদাহরণ:
এখানে, TriggerHandler
ক্লাসে একটি Static Boolean ফ্ল্যাগ isExecuted
ব্যবহার করা হয়েছে যা false
চেক করার মাধ্যমে Trigger একবার চালানোর পর সেটিকে true
করে। পরবর্তীতে Trigger চালু হলে এটি true
চেক করবে এবং Recursive Trigger এড়ানো হবে।
public class TriggerHandler {
public static Boolean isExecuted = false;
}
trigger PreventRecursive on Account (before update) {
if (!TriggerHandler.isExecuted) {
TriggerHandler.isExecuted = true;
// Trigger Logic
System.debug('Trigger executed only once.');
}
}
Trigger Context Variables ব্যবহার: Trigger Context Variables, যেমন Trigger.isInsert
, Trigger.isUpdate
, ইত্যাদি ব্যবহার করে Trigger-এর ইভেন্ট অনুযায়ী কোডের কার্যক্রম সীমিত করা যায়। এটি অতিরিক্ত Recursive Trigger এড়াতে সহায়ক।
Handler Class ব্যবহার: Trigger Handler Pattern ব্যবহার করে Trigger কোড সেপারেট ক্লাসে স্থানান্তর করা হয়, যা ট্রিগারের কার্যক্রম নিয়ন্ত্রণে রাখে এবং Recursive Trigger এড়াতে সাহায্য করে।
Trigger কার্যকরী এবং ইফেক্টিভভাবে লিখতে কিছু Best Practices অনুসরণ করা উচিত:
Trigger Handler Class ব্যবহার: Trigger Handler ক্লাস ব্যবহার করে Trigger-এর লজিক পৃথক ক্লাসে রাখা উচিত। এতে কোডের রক্ষণাবেক্ষণ সহজ হয় এবং লজিক পুনরায় ব্যবহার করা যায়।
উদাহরণ:
trigger AccountTrigger on Account (before insert, after update) {
AccountTriggerHandler.handleTrigger(Trigger.new, Trigger.oldMap);
}
public class AccountTriggerHandler {
public static void handleTrigger(List<Account> newList, Map<Id, Account> oldMap) {
// Trigger Logic
}
}
Single Trigger per Object নীতি অনুসরণ করা: একটি অবজেক্টের জন্য একটি মাত্র Trigger রাখা ভালো। এটি সহজ এবং সুগঠিত কোড লেখায় সাহায্য করে।
Context-Specific Logic ব্যবহার: Trigger Context Variables (যেমন Trigger.isInsert
, Trigger.isUpdate
) ব্যবহার করে কোডের কার্যক্ষমতা বাড়ানো যায়। Trigger-এর জন্য নির্দিষ্ট লজিক অনুযায়ী আলাদা ব্লক তৈরি করা উচিত।
Bulkification: Trigger সবসময় Bulk করতে হবে, অর্থাৎ এটি ২০০ রেকর্ড পর্যন্ত হ্যান্ডেল করতে সক্ষম হওয়া উচিত। তাই SOQL, DML, এবং লুপগুলি Bulkified হতে হবে। একক রেকর্ডে কাজ না করে for
লুপ ব্যবহার করে তালিকায় কাজ করা উচিত।
Bulkification উদাহরণ:
trigger AccountTrigger on Account (after insert) {
List<Contact> contacts = new List<Contact>();
for (Account acc : Trigger.new) {
contacts.add(new Contact(LastName = acc.Name, AccountId = acc.Id));
}
if (!contacts.isEmpty()) {
insert contacts;
}
}
Avoid Hardcoding Ids: কোনো ফিল্ড বা রেকর্ডের Id হার্ডকোড করা উচিত নয়, কারণ এটি সহজে পরিবর্তনযোগ্য নয় এবং মোডিফিকেশনে সমস্যা হতে পারে। এটির পরিবর্তে Custom Settings বা Custom Metadata ব্যবহার করা উচিত।
Avoid Recursive Trigger: Recursive Trigger এড়াতে Static Boolean Flag বা Trigger Context ব্যবহার করা উচিত।
Trigger Logic Minimization: Trigger-এ বড় লজিক না রেখে Handler ক্লাস ব্যবহার করা উচিত। Trigger শুধুমাত্র প্রাথমিক কাজ সম্পন্ন করবে এবং বড় লজিক আলাদা ক্লাসে রাখা হবে।
Trigger Unit Testing: Trigger Unit Test লিখা জরুরি। Test Class ব্যবহার করে ট্রিগার কার্যক্ষমতা যাচাই করতে হবে এবং সকল লজিক কভার করতে হবে। এর জন্য Insert, Update, Delete ইভেন্টের জন্য Test Class তৈরি করা উচিত।
Order of Execution বুঝে লেখা: Salesforce Trigger-এর অর্ডার অফ এক্সিকিউশন অনুযায়ী কাজ করে। তাই Before ও After Trigger কোনটা আগে ও পরে কাজ করবে তা মাথায় রেখে কোড লিখা উচিত।
SOQL Query and DML Limits মেনে চলা: Trigger-এ SOQL কুয়েরি এবং DML অপারেশনের সংখ্যা সীমিত রাখা উচিত, যাতে গভর্নর লিমিট না ছাড়িয়ে যায়।
Trigger Best Practices অনুসরণ করে Trigger কোডের কার্যকারিতা এবং পুনঃব্যবহারযোগ্যতা বাড়ানো যায় এবং গভর্নর লিমিট সমস্যা এড়ানো সম্ভব হয়।
common.read_more